const {
    req
} = require('../util/req');
const XLSX = require('xlsx');

export function uploadData(data) {

    console.log(`\n 进度：开始批量上传 exel 数据\n\n`);

    data.data.token = data.token;

    return new Promise((resolve, reject) => {
        req.post({
            url: data.url,
            data: data.data,
            success() {
                console.log(`\n 结束：上传成功，共计${data.data.length}条`);
                resolve(data.successData);

            },
            error(err, a, b) {
                console.log(`\n 错误：上传失败，服务端错误\n\n`, err, a, b, "\n\n");
                reject(data.errData)
            }
        })
    })

}

/**
 * 计算单元格坐标，A1，B2
 * 
 * @param {*} x ：横坐标 ，比如A
 * @param {*} y ：纵坐标，比如2
 */
export function getPosition(x, y) {

    // 转成大写字母，A，所以加64
    let pos_letter = String.fromCharCode(64 + x);
    let pos_number = y;

    return pos_letter + pos_number;
}

// 获取 exel 文件 的 结构
export function getStruct(downloadUrl) {


    let wb = XLSX.readFile('static/' + downloadUrl);

    let table = wb.Sheets[wb.SheetNames[0]]; // 默认只取第一个Sheet

    // console.log(222222222222,table)

    let ref = table['!ref']; // 选定数据区域，如：A1:C109
    let columnMax = ref.split(':')[1]; // 最后一个单元格，如：C109

    let lines = parseInt(/\d{1,4}$/.exec(columnMax)[0]); // 行数，如：109
    let columns = /^[A-Z]/.exec(columnMax)[0].charCodeAt() - 64; // 列数，从字母转成数字 如：2

    console.log(`\n 进度：读取此产品的结构：${lines} 行，${columns} 列`);

    return {
        lines: lines,
        columns: columns,
        table: table,
    }

}

// 把解析的 exel 的每一条记录保存起来
export function pushRateToList(data, list) {

    // productBase 基本保额
    data.price = (data.price / data.productBase * 10000).toFixed(2); //折算成10000元基本保费

    delete data.productBase
    list.push(data);

}

/**
 * 解析 exel 文件
 * 行数 是 数字，i
 * 列数 是 大写字母，A，B
 */
export function readExel(opt) {

    let lines = opt.lines
    let cols = opt.cols
    let table = opt.table
    let startLine = opt.startLine || 1
    let fixCol = opt.fixCol || 0
    let colList = opt.colList
    let each = opt.each;
    let eachLine = opt.eachLine;

    // 从 1 开始，因为最小是 1，没有第 0 行 :A1
    for (let i = startLine; i <= lines; i++) {
        
        let fixVal = [];

        // 把固定的列保存起来
        for (let c = 1; c < fixCol + 1; c++) {
            // console.log(getPosition(c, i),c,i,table)
            let table_pos = table[getPosition(c, i)]

            if (!table_pos) {
                continue;
            }
            fixVal.push(table_pos.v);
        }

        if (typeof eachLine === 'function') {
            var lineData = []
        }

        // 没有第一列 + age占了一列，所以从 2 开始
        for (let j = 1 + fixCol; j <= cols; j++) {

            let position = getPosition(j, i); // 计算单元格坐标
            let table_pos = table[position]

            // console.log("table_pos",table_pos)

            // 这里是每一行是一条数据
            typeof eachLine === 'function' && lineData.push(table_pos&&table_pos.v)

            if (!table_pos) {
                continue;
            }

            //获得单元格数据
            let val = table_pos.v;

            if (each) {
                // 为什么要减？因为exel从1 开始，数组从0 开始
                // 每个格子，都有一个配置项 {sexId: 1, premiumPaymentPeriod: "20"}
                // 如果有的格子，不含配置项，那么就去掉这个这个列，列数要后退
                // columnList 第一项 对应 第3列，前两列是其他数据
                // 如果所有格子，都有配置，那么是 减1，j从1开始，j-1=0，columnList第0个
                let colConf = colList[j - fixCol - 1]

                // 返回当前行的配置（columnConf）+当前格的值（val）+行数（j）
                // 这里是没一个格子是一条数据
                each(val, i, j, colConf, fixVal)
            }

        }

        eachLine && eachLine(lineData);
    }
}